import Dexie from 'dexie'
import { onBeforeUnmount } from 'vue'

type Props = {
	databaseName: string // 数据库名称
	tableName: string // 表名称
}

type ReturnType = {
	saveDataIdb: (data: { [key: string]: any; uid: string }) => void // 保存数据到数据库
	getDataByUid: (uid: string) => Promise<any> // 根据uid获取数据
	getAllData: () => Promise<any[]> // 获取所有数据
	deleteDataByUid: (uid: string) => Promise<any> // 根据uid删除数据
	closeDatabase: () => void // 关闭数据库
}

export default ({ databaseName, tableName }: Props): ReturnType => {
	if (!databaseName) {
		throw new Error('数据库名称不能为空')
	}
	if (!tableName) {
		throw new Error('表名称不能为空')
	}

	const db: any = new Dexie(databaseName)
	db.version(1).stores({
		[tableName]: '++id, item, uid',
	})
	db.open()
		.then(() => {
			console.log('数据库打开成功')
		})
		.catch((err: any) => {
			console.error('数据库打开失败', err)
		})

	/**
	 * 保存数据到数据库
	 */
	async function saveDataIdb(data: { [key: string]: any; uid: string }) {
		const currentTable = db[tableName]
		const count = await currentTable.where('uid').equals(data.uid).count()
		const savaData = {
			item: data,
			uid: data.uid,
		}
		return new Promise((resolve, reject) => {
			if (count > 0) {
				// 数据存在，更新数据
				db[tableName]
					.where('uid')
					.equals(data.uid)
					.modify(savaData)
					.then(() => {
						// console.log('修改：数据保存成功')
            resolve('修改成功')
					})
					.catch((err: any) => {
						console.error('修改：数据保存失败', err)
            reject(null)
					})
				// console.log('数据已存在')
			} else {
				// 数据不存在，新增数据
				// console.log('数据不存在')
				currentTable
					.add(savaData)
					.then(() => {
						// console.log('新增：数据保存成功')
            resolve('新增成功')
					})
					.catch((err: any) => {
						console.error('新增：数据保存失败', err)
            reject(null)
					})
			}
		})
	}

	/**
	 * 根据uid获取数据
	 * @param uid uid
	 * @returns 数据
	 *
	 */
	async function getDataByUid(uid: string): Promise<any> {
		return await db[tableName].where('uid').equals(uid).first()
	}

	/**
	 * 获取所有数据
	 * @returns 所有数据
	 */
	function getAllData(): Promise<any[]> {
		return db[tableName].toArray()
	}

	/**
	 * 根据uid删除数据
	 * @param uid uid
	 * @returns 删除结果
	 */
	async function deleteDataByUid(uid: string): Promise<any> {
		return await db[tableName].where('uid').equals(uid).delete()
	}

	/**
	 * 关闭数据库
	 */
	async function closeDatabase() {
		if (!db) {
			return
		}
		db?.close()
	}

	onBeforeUnmount(() => {
		closeDatabase()
	})
	return {
		saveDataIdb,
		getDataByUid,
		getAllData,
		deleteDataByUid,
		closeDatabase,
	}
}
